foreach (Event evt in SelectedEventFile?.Events)
{
    if (evt.valEvtIgnoreImpact) continue;

    DateTime start = evt.valEvtStartTime;
    DateTime end = evt.valEvtEndTime;

    // -----------------------
    // FLOW CENTROID (peak 30-min window)
    // -----------------------
    SubEvent flowWindow = getSubEventValues(start, end, 0.5, lstVolStormPerTs);

    int flowStartIdx = clsUtlts.getIdxFromList(lstVolStormPerTs, flowWindow.valStartTime);
    int flowEndIdx   = clsUtlts.getIdxFromList(lstVolStormPerTs, flowWindow.valEndTime);

    if (flowStartIdx == -1 || flowEndIdx == -1)
        continue;

    double flowWeightedTimeSum = 0;
    double flowTotalVolume = 0;
    double elapsedMinutes = 0;

    for (int i = flowStartIdx; i <= flowEndIdx; i++)
    {
        double flow = lstVolStormPerTs[i].valDbl;

        flowWeightedTimeSum += flow * elapsedMinutes;
        flowTotalVolume += flow;
        elapsedMinutes += hydTStepMinute;
    }

    if (flowTotalVolume == 0)
        continue;

    double flowCentroidOffset = flowWeightedTimeSum / flowTotalVolume;

    DateTime flowCentroidTime =
        flowWindow.valStartTime.AddMinutes(flowCentroidOffset);

    evt.valPeakHalfHourTimeShiftFlow = flowCentroidTime;

    // -----------------------
    // RAIN CENTROID (peak 30-min window)
    // -----------------------
    SubEvent rainWindow = getSubEventValues(start, end, 0.5, clsHydSeg1.valLstRdData);

    int rainStartIdx = clsUtlts.getIdxFromList(clsHydSeg1.valLstRdData, rainWindow.valStartTime);
    int rainEndIdx   = clsUtlts.getIdxFromList(clsHydSeg1.valLstRdData, rainWindow.valEndTime);

    if (rainStartIdx == -1 || rainEndIdx == -1)
        continue;

    double rainWeightedTimeSum = 0;
    double rainTotal = 0;

    for (int i = rainStartIdx; i < rainEndIdx; i++)
    {
        DateTime t = clsHydSeg1.valLstRdData[i].valTStamp;
        double rain = clsHydSeg1.valLstRdData[i].valDbl;

        double minutesSinceStart = (t - rainWindow.valStartTime).TotalMinutes;

        rainWeightedTimeSum += rain * minutesSinceStart;
        rainTotal += rain;
    }

    if (rainTotal == 0)
        continue;

    double rainCentroidOffset = rainWeightedTimeSum / rainTotal;

    DateTime rainCentroidTime =
        rainWindow.valStartTime.AddMinutes(rainCentroidOffset);

    evt.valPeakHalfHourRain = rainCentroidTime;

    // -----------------------
    // FINAL RESULT
    // -----------------------
    // Time lag between centroids:
    //      flow centroid time - rain centroid time
}